package com.prs.crm.dao.flow;

import java.util.Collection;
import java.util.List;

import org.courser.ui.PaginationSupport;

import com.prs.crm.dao.BaseDao;
import com.prs.crm.domain.FlowEntity;
import com.prs.crm.domain.flow.WorkFlowProcess;
import com.prs.crm.domain.flow.WorkFlowProcessNode;
import com.prs.crm.domain.hr.Person;

/**
 * 工作流进行dao
 * @author Administrator
 *
 */
public interface WorkFlowProcessDao extends BaseDao<WorkFlowProcess>{

	/**
	 * 根据节点类型获取执行中的流程结点
	 * @param process
	 * @param nodeType
	 * @return
	 */
	Collection<WorkFlowProcessNode> getNodeByNodeType(WorkFlowProcess process,Integer nodeType);
	
	/**
	 * 查找cls指定的包含流程执行的实体
	 * @param cls
	 * @param person
	 * @param status
	 * @return
	 */
	@SuppressWarnings("unchecked")
	Collection<?> findFlowEntitys(final Class cls,final Person person,final Integer[] status);
	
	/**
	 * 获取指定执行状态的流程执行结点
	 * @param process
	 * @return
	 */
	Collection<WorkFlowProcessNode> getNodeByStatus(WorkFlowProcess process,Integer status);
		
	/**
	 * 查找下一个执行结点
	 * @param node
	 * @return
	 */
	Collection<WorkFlowProcessNode> getNextProcessNodes(WorkFlowProcessNode node);
	
	

	/**
	 * 保存执行结点
	 * @param node
	 */
	void saveProcessNode(WorkFlowProcessNode node);
	
	
	/**
	 * 根据一个执行结点，获取与之相关的模型
	 * @param process
	 * @param cls
	 * @return
	 */
	@SuppressWarnings("unchecked")
	FlowEntity findProcessEntity(WorkFlowProcess process,Class cls);
	
	/**
	 * 保存正处于流程中的实体
	 * @param entity
	 */
	void saveProcessEntity(FlowEntity entity);
	
	/**
	 * 查找流程中指定状态（结果）的结点
	 * @param process
	 * @param status
	 * @param result
	 * @return
	 */
	int countProcessNodes(WorkFlowProcess process,Integer status,Integer result);
	
	/**
	 * 更新流程结点的状态和结果信息
	 * @param process
	 * @param status
	 * @param result
	 * @return
	 */
	int updateProcessNode(WorkFlowProcess process,Integer status,Integer result);
	
	PaginationSupport pageQueryFlowNode(Class<?> cls,PaginationSupport page,Person person,Integer[] status);
	
	
	/**
	 * 根据ID查询对象
	 */
	WorkFlowProcess   getWorkFlowProcess(java.io.Serializable id);
	
	/**
	 * 根据WorkFlowProcess找对象
	 */
	
	List<WorkFlowProcessNode> getWorkFlowProcessNode(WorkFlowProcess flowProcess);
	
	void saveOrUpdate(WorkFlowProcess flowProcess);
	
	void saveOrUpdateWorkFlowProcessNode(WorkFlowProcessNode workFlowProcessNode);
}
